package com.yunyao.dao.service.bamu.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.yunyao.common.constant.enums.BindContractStatusEnums;
import com.yunyao.common.constant.enums.DataDeletedStatus;
import com.yunyao.dao.mapper.BamuContractMaterialMapper;
import com.yunyao.dao.mapper.BamuSaleContractMapper;
import com.yunyao.dao.model.BamuPurchaseContract;
import com.yunyao.dao.model.BamuSaleContract;
import com.yunyao.dao.service.bamu.IBamuSaleContractService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.validation.constraints.NotNull;
import java.math.BigDecimal;
import java.util.List;

/**
 * <p>
 * 销售合同表 服务实现类
 * </p>
 *
 * @author xingjishuai
 * @since 2024-07-02
 */
@Service
public class BamuSaleContractServiceImpl extends ServiceImpl<BamuSaleContractMapper, BamuSaleContract> implements IBamuSaleContractService {
    @Autowired
    private BamuContractMaterialMapper bamuContractMaterialMapper;
    /**
     * 根据ID获取未删除的销售合同
     * 此方法用于检索已标记为未删除的特定销售合同详细信息
     * 如果合同ID为空或未找到符合条件的记录，则返回null
     *
     * @param id 合同的唯一标识符
     * @return 返回未删除的销售合同对象，如果找不到或ID无效则返回null
     */
    @Override
    public BamuSaleContract getByIdNoDelete(String id) {
        // 检查ID是否为空或空白，如果是，则返回null
        if (StringUtils.isBlank(id)) {
            return null;
        }

        // 创建一个LambdaQueryWrapper对象用于构建查询条件
        LambdaQueryWrapper<BamuSaleContract> wrapper = new LambdaQueryWrapper<>();
        // 添加条件，要求合同ID与传入的ID匹配
        wrapper.eq(BamuSaleContract::getId, id);
        // 添加条件，要求合同未被标记为删除
        wrapper.eq(BamuSaleContract::getIsDeleted, DataDeletedStatus.NO.getType());

        // 使用构建的查询条件查询并返回匹配的销售合同对象
        return getOne(wrapper);
    }

    /**
     * 根据合同ID更新合同的总价和数量
     * 该方法通过计算所有关联材料的总数量和总价来更新合同的信息
     *
     * @param contractId 合同的ID，用于定位特定的合同
     */
    @Override
    public void updateTotalPriceAndNumByContractId(String contractId) {
        // 获取合同关联材料的总数量
        BigDecimal totalNum = bamuContractMaterialMapper.getTotalNumByContractId(contractId);
        // 获取合同关联材料的总价
        BigDecimal totalPrice = bamuContractMaterialMapper.getTotalPriceByContractId(contractId);

        // 构建更新条件和内容
        LambdaUpdateWrapper<BamuSaleContract> wrapper =
                new LambdaUpdateWrapper<BamuSaleContract>().eq(BamuSaleContract::getId, contractId)
                        .set(BamuSaleContract::getContractNum, totalNum)
                        .set(BamuSaleContract::getContractTotalPrice, totalPrice);
        // 执行更新操作
        update(wrapper);
    }

    /**
     * 根据ID更新绑定状态
     * 该方法旨在更新销售合同的绑定状态，仅当合同未绑定时将其标记为已绑定
     *
     * @param id 合同的唯一标识符
     */
    @Override
    public void updateBindById(String id) {
        // 创建一个条件构造器，用于指定更新操作的条件
        LambdaUpdateWrapper<BamuSaleContract> wrapper =
                // 指定需要更新的合同必须与给定的ID匹配
                new LambdaUpdateWrapper<BamuSaleContract>()
                        .eq(BamuSaleContract::getId, id)
                        // 确保只有当合同的当前绑定状态为“未绑定”时才进行更新
                        .eq(BamuSaleContract::getBindContractStatus, BindContractStatusEnums.NO.getTypeStr())
                        // 设置新的绑定状态为“已绑定”
                        .set(BamuSaleContract::getBindContractStatus, BindContractStatusEnums.YES.getTypeStr());
        // 执行更新操作
        update(wrapper);
    }

    /**
     * 根据ID更新合同绑定状态为未绑定
     * 此方法用于处理解除合同绑定的情况，通过设置条件只更新已绑定的合同状态
     * 使用Lambda表达式简化了条件的书写，提高了代码的可读性
     *
     * @param id 合同的唯一标识符
     */
    @Override
    public void updateUnBindById(String id) {
        // 构建更新条件：根据ID和当前绑定状态（已绑定），更新为未绑定状态
        LambdaUpdateWrapper<BamuSaleContract> wrapper =
                new LambdaUpdateWrapper<BamuSaleContract>()
                        // 仅处理指定ID的合同
                        .eq(BamuSaleContract::getId, id)
                        // 当前状态为已绑定
                        .eq(BamuSaleContract::getBindContractStatus, BindContractStatusEnums.YES.getTypeStr())
                        // 更新状态为未绑定
                        .set(BamuSaleContract::getBindContractStatus, BindContractStatusEnums.NO.getTypeStr());
        // 执行更新操作
        update(wrapper);
    }

    @Override
    public void updateTotalRealPriceAndNumByContractId(String contractId) {
        // 获取合同关联材料的总价
        BigDecimal totalPrice = bamuContractMaterialMapper.getTotalPriceByContractId(contractId);
        // 构建更新条件和内容
        LambdaUpdateWrapper<BamuSaleContract> wrapper =
                new LambdaUpdateWrapper<BamuSaleContract>()
                        .eq(BamuSaleContract::getId, contractId)
                        .eq(BamuSaleContract::getContractTotalRealPrice, 0)
                        .set(BamuSaleContract::getContractTotalRealPrice, totalPrice);
        // 执行更新操作
        update(wrapper);
    }


    public List<String> findByContractId(@NotNull String contractId){
        return baseMapper.findByContractId(contractId);
    }

    @Override
    public List<BamuSaleContract> listById(String Id) {
        // 检查合同ID是否为空或空白，如果是，则返回一个空列表
        if (StringUtils.isBlank(Id)) {
            return List.of();
        }
        // 创建一个LambdaQueryWrapper用于构建查询条件
        LambdaQueryWrapper<BamuSaleContract> wrapper =
                new LambdaQueryWrapper<BamuSaleContract>().eq(BamuSaleContract::getId,
                        Id).eq(BamuSaleContract::getIsDeleted, DataDeletedStatus.NO.getType());
        // 使用构建的查询条件获取并返回关联的材料列表
        return list(wrapper);
    }

}
